package com.doctor.windflower_doctor.util;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

/**
 * <p>
 * 功能
 * </p>
 * 
 * <p>
 * Copyright 北京亚普拓信息咨询服务有限公司 2014 All right reserved.
 * </p>
 * 
 * @author 皮勉 时间 2014年11月18日 下午3:53:15
 * @version 1.0 </br> 最后修改人 无
 * 
 */
public class RecordThread extends Thread {
	private AudioRecord ar;
	private int bs;
	private static int SAMPLE_RATE_IN_HZ = 8000;
	private boolean isRun = false;
	private double voice;

	Object mLock;

	@SuppressWarnings("deprecation")
	public RecordThread() {
		super();
		mLock = new Object();
		bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
		ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bs);
	}

	public void run() {
		super.run();
		ar.startRecording();
		// 用于读取的 buffer
		byte[] buffer = new byte[bs];
		isRun = true;
		while (isRun) {
			int r = ar.read(buffer, 0, bs);
			int v = 0;
			// 将 buffer 内容取出，进行平方和运算
			for (int i = 0; i < buffer.length; i++) {
				// 这里没有做运算的优化，为了更加清晰的展示代码
				v += buffer[i] * buffer[i];
			}
			// 平方和除以数据总长度，得到音量大小。可以获取白噪声值，然后对实际采样进行标准化。
			// 如果想利用这个数值进行操作，建议用 sendMessage 将其抛出，在 Handler 里进行处理。

			System.out.println("音量现在大小---->>>" + String.valueOf(v / (float) r));
			Log.d("spl", String.valueOf(v / (float) r));
			voice = v / (float) r;
			synchronized (mLock) {
				try {
					mLock.wait(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		ar.stop();
		ar.release();
	}

	public void pause() {
		// 在调用本线程的 Activity 的 onPause 里调用，以便 Activity 暂停时释放麦克风
		isRun = false;
	}

	public void start() {
		Log.d("spl", "start=============");
		// 在调用本线程的 Activity 的 onResume 里调用，以便 Activity 恢复后继续获取麦克风输入音量
		if (!isRun) {
			super.start();
		}
	}

	public double getAmplitude() {
		return voice;
	}
}
